Biomes in North and South America
BiomeMap <- qtm(biomes_shp,
fill="biomes",
fill.style="fixed",
fill.labels=biomes_shp$biomes,
fill.palette=cols7,
fill.title="Biomes",
layout.legend.position=c("left","bottom"),
layout.legend.width=1.5,
layout.frame=FALSE)
BiomeMap

Figure 1. Map of North and South American biomes.
Beta Diversity Plots by Biome
BiomeBetaWeightBV <- ggplot(BiomeBetaCellsCentCov, aes(x=Type, y=Beta, fill=Type, color=Type)) +
geom_boxplot(show.legend = FALSE, fill=biome_cols_11, color="black") +
guides(x = guide_axis(angle=30)) +
#theme_minimal() + #un-comment whichever theme you want
theme_gray() +
#theme_light() +
#theme_bw() +
geom_violin(scale="count", show.legend=FALSE, fill="gray", alpha=0.35,
color="gray25") +
xlab("Biome") +
ylab("Beta Diversity") +
theme(axis.title.y = element_text(size=22),
axis.title.x = element_text(size=22),
axis.text.y = element_text(size=16),
axis.text.x = element_text(angle = 30, hjust = 1, size = 16))
BiomeBetaWeightBV
Range Size Plots by Biome
BiomeBetaWeightBV <- ggplot(BiomeBetaCellsCentCov, aes(x=Type, y=Beta, fill=Type, color=Type)) +
geom_boxplot(show.legend = FALSE, fill=biome_cols_11, color="black") +
guides(x = guide_axis(angle=30)) +
#theme_minimal() + #un-comment whichever theme you want
theme_gray() +
#theme_light() +
#theme_bw() +
geom_violin(scale="count", show.legend=FALSE, fill="gray", alpha=0.35,
color="gray25") +
xlab("Biome") +
ylab("Beta Diversity") +
theme(axis.title.y = element_text(size=32),
axis.title.x = element_text(size=32),
axis.text.y = element_text(size=16),
axis.text.x = element_text(angle = 30, hjust = 1, size = 16))
BiomeBetaWeightBV

Alpha Diversity by Order, Split into Biomes
Orders with Maximum Alpha Diversity > 10
BiomeRangeBV <- ggplot(BiomeRange, aes(x=Type, y=Range, fill=Type, color=Type)) +
geom_boxplot(show.legend = FALSE, fill=biome_cols_11, color="black") +
guides(x = guide_axis(angle=30)) +
#un-comment whichever theme you want
#theme_minimal() +
theme_gray() +
#theme_light() +
#theme_bw() +
geom_violin(scale="count", show.legend=FALSE, fill="gray", alpha=0.35,
color="gray25") +
xlab("Biome") +
ylab("Range") +
theme(axis.title.y = element_text(size=32),
axis.title.x = element_text(size=32),
axis.text.y = element_text(size=20),
axis.text.x = element_text(angle = 30, hjust = 1, size = 16))
BiomeRangeBV

Orders with Maximum Alpha Diversity between 10 and 25
FacetOBRBelow10 <- ggplot(OBRBelow10DF, aes(x=Biome, y=Alpha, fill=Biome, color=Biome)) +
geom_boxplot(show.legend = FALSE, fill=biome_cols_166, color="black", outlier.size=0.7) +
#un-comment whichever theme you want
#theme_minimal() +
theme_gray() +
#theme_light() +
#theme_bw() +
#theme_dark() +
#theme_linedraw() +
#geom_violin(scale="count", show.legend=FALSE, fill="gray", alpha=0.35, color="gray25") +
xlab("Biome") +
ylab("Richness") +
theme(axis.title.y = element_text(size=32),
axis.title.x = element_text(size=32),
axis.text.y = element_text(size=15),
axis.text.x = element_text(angle = 90, hjust = 1, size = 12))+
facet_wrap(~Order,
#un-comment # of rows you want
ncol=6
#ncol=5
)
FacetOBRBelow10

Orders with Maximum Alpha Diversity between 25 and 100
FacetOBR10to25 <- ggplot(OBR10to25DF, aes(x=Biome, y=Alpha, fill=Biome, color=Biome)) +
geom_boxplot(show.legend = FALSE, fill=biome_cols_66, color="black", outlier.size=0.7) +
#un-comment whichever theme you want
#theme_minimal() +
theme_gray() +
#theme_light() +
#theme_bw() +
#theme_dark() +
#theme_linedraw() +
geom_violin(scale="count", show.legend=FALSE, fill="gray", alpha=0.35, color="gray25") +
xlab("Biome") +
ylab("Richness") +
theme(axis.title.y = element_text(size=32),
axis.title.x = element_text(size=32),
axis.text.y = element_text(size=15),
axis.text.x = element_text(angle = 45, hjust = 1, size = 12))+
facet_wrap(~Order,
#un-comment # of rows you want
ncol=3
#ncol=2
)
FacetOBR10to25

Orders with Maximum Alpha Diversity > 100
FacetOBR25to100 <- ggplot(OBR25to100DF, aes(x=Biome, y=Alpha, fill=Biome, color=Biome)) +
geom_boxplot(show.legend = FALSE, fill=biome_cols_87, color="black", outlier.size=0.7) +
#un-comment whichever theme you want
#theme_minimal() +
theme_gray() +
#theme_light() +
#theme_bw() +
#theme_dark() +
#theme_linedraw() +
geom_violin(scale="count", show.legend=FALSE, fill="gray", alpha=0.35, color="gray25") +
xlab("Biome") +
ylab("Richness") +
theme(axis.title.y = element_text(size=32),
axis.title.x = element_text(size=32),
axis.text.y = element_text(size=15),
axis.text.x = element_text(angle = 30, hjust = 1, size = 10)) +
facet_wrap(~Order,
#un-comment # of rows you want
ncol=4
#ncol=2
)
FacetOBR25to100

Circle Plots
Species richness for each order, grouped by biome
All bryophyte orders
FacetOBRAbove100 <- ggplot(OBRAbove100DF, aes(x=Biome, y=Alpha, fill=Biome, color=Biome)) +
geom_boxplot(show.legend = FALSE, fill=biome_cols_22, color="black", outlier.size=1) +
#un-comment whichever theme you want
#theme_minimal() +
theme_gray() +
#theme_light() +
#theme_bw() +
#theme_dark() +
#theme_linedraw() +
geom_violin(scale="count", show.legend=FALSE, fill="gray", alpha=0.35, color="gray25") +
xlab("Biome") +
ylab("Richness") +
theme(axis.title.y = element_text(size=32),
axis.title.x = element_text(size=32),
axis.text.y = element_text(size=15),
axis.text.x = element_text(angle = 45, hjust = 1, size = 12)) +
facet_wrap(~Order,
#un-comment # of rows you want
ncol=2
#ncol=1
)
FacetOBRAbove100

Only moss orders
circos.clear()
circos.par(start.degree = 0)
chordDiagram(CircleMatAll, grid.col = grid.col, column.col = biome_cols_11,
directional = 1, direction.type = "arrows", link.arr.type = "big.arrow",
link.arr.length = 0.05, link.largest.ontop = T, annotationTrack = c("grid"),
preAllocateTracks = 1, big.gap = 20, small.gap = 2)
circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) {
xlim = get.cell.meta.data("xlim")
ylim = get.cell.meta.data("ylim")
sector.name = get.cell.meta.data("sector.index")
circos.text(mean(xlim), ylim[1], sector.name, facing = "clockwise", niceFacing = TRUE, adj = c(0, 0.5), cex=0.5)
}, bg.border = NA)

LS0tCnRpdGxlOiAiQnJ5b3BoeXRlIERpdmVyc2l0eSBQYXR0ZXJucyBBY3Jvc3MgQmlvbWVzIGluIE5vcnRoIGFuZCBTb3V0aCBBbWVyaWNhIgphdXRob3I6ICJIYWlsZXkgTmFwaWVyIGFuZCBLYXRocnluIERhd2R5IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CnJlcXVpcmUoa25pdHIpCnJlcXVpcmUobGF0ZXhwZGYpCnJlcXVpcmUoc3ApCnJlcXVpcmUodmVnYW4pCnJlcXVpcmUocmFzdGVyKQpyZXF1aXJlKHJhc3RlclZpcykKcmVxdWlyZShnZ3Bsb3QyKQpyZXF1aXJlKGdyaWRFeHRyYSkKcmVxdWlyZShzZikKcmVxdWlyZShyZ2RhbCkKcmVxdWlyZShycHJvanJvb3QpCnJlcXVpcmUodG1hcCkKcmVxdWlyZShjaXJjbGl6ZSkKYGBgCgpgYGB7ciwgc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Kcm9vdCA8LSBmaW5kX3JzdHVkaW9fcm9vdF9maWxlKCkKb3B0c19rbml0JHNldChyb290LmRpciA9IHJvb3QpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KI0xvYWQgcGxvdCBkYXRhCiNSdW4gRGF0YVByb2Nlc3NpbmcyMDIwIGZvciBwbG90IGRhdGEKQmlvbWVCZXRhQ2VsbHNDZW50Q292IDwtIHJlYWRSRFMoIkRhdGEvQmlvbWVCZXRhQ2VsbHNDZW50Q292LnJkcyIpCmJpb21lc19zaHAgPC0gc2hhcGVmaWxlKCJEYXRhL0Jpb21lcy9CaW9tZXNfb2xzb25fcHJvamVjdGVkLnNocCIpCkJpb21lUmFuZ2UgPC0gcmVhZFJEUygiRGF0YS9CaW9tZVJhbmdlLnJkcyIpCk9CUkFib3ZlMTAwREYgPC0gcmVhZFJEUygiRGF0YS9PQlJBYm92ZTEwMERGLnJkcyIpCk9CUjI1dG8xMDBERiA8LSByZWFkUkRTKCJEYXRhL09CUjI1dG8xMDBERi5yZHMiKQpPQlIxMHRvMjVERiA8LSByZWFkUkRTKCJEYXRhL09CUjEwdG8yNURGLnJkcyIpCk9CUkJlbG93MTBERiA8LSByZWFkUkRTKCJEYXRhL09CUkJlbG93MTBERi5yZHMiKQpDaXJjbGVNYXRBbGwgPC0gcmVhZFJEUygiRGF0YS9DaXJjbGVNYXRBbGwucmRzIikKQ2lyY2xlTWF0QWxsTW9zcyA8LSByZWFkUkRTKCJEYXRhL0NpcmNsZU1hdEFsbE1vc3MucmRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQojTG9hZCBwbG90IGNvbG9ycwpjb2xzNyA8LSBjKCIjRDhCNzBBIiwgIiM5NzJEMTUiLCAiI0EyQTQ3NSIsICIjODFBODhEIiwgIiMwMjQwMUIiLAogICAgICAgICAgICIjNDQ2NDU1IiwgIiNGREQyNjIiLCAiI0QzREREQyIsICIjQzdCMTlDIiwgIiM3OThFODciLAogICAgICAgICAgICIjQzI3RDM4IikKYmlvbWVfY29sc18xMSA8LSBjKCIjRDhCNzBBIiwgIiM5NzJEMTUiLCAiI0EyQTQ3NSIsICIjODFBODhEIiwKICAgICAgICAgICAgICAgICAgICIjMDI0MDFCIiwiIzQ0NjQ1NSIsICIjRkREMjYyIiwgIiNEM0REREMiLAogICAgICAgICAgICAgICAgICAgIiNDN0IxOUMiLCAiIzc5OEU4NyIsICIjQzI3RDM4IikKCmJpb21lX2NvbHNfMjIgPC0gYyhiaW9tZV9jb2xzXzExLCBiaW9tZV9jb2xzXzExKQoKYmlvbWVfY29sc184NyA8LSBjKGJpb21lX2NvbHNfMjIsIGJpb21lX2NvbHNfMTEsCiAgICAgICAgICAgICAgICAgICAiI0Q4QjcwQSIsICIjOTcyRDE1IiwgIiNBMkE0NzUiLCAiIzgxQTg4RCIsCiAgICAgICAgICAgICAgICAgICAiIzAyNDAxQiIsICIjNDQ2NDU1IiwgIiNGREQyNjIiLCAiI0QzREREQyIsCiAgICAgICAgICAgICAgICAgICAiI0M3QjE5QyIsICIjQzI3RDM4IiwgYmlvbWVfY29sc18yMiwgYmlvbWVfY29sc18yMikKCmJpb21lX2NvbHNfNjYgPC0gYyhiaW9tZV9jb2xzXzIyLCBiaW9tZV9jb2xzXzIyLCBiaW9tZV9jb2xzXzIyKQoKYmlvbWVfY29sc18xNjYgPC0gYyhiaW9tZV9jb2xzXzIyLAogICAgICAgICAgICAgICAgICAgIGMoIiNEOEI3MEEiLCAiIzk3MkQxNSIsICIjQTJBNDc1IiwgIiM4MUE4OEQiLCAgIiMwMjQwMUIiLCAiI0ZERDI2MiIsICIjRDNERERDIiwgIiNDN0IxOUMiLCAgIiNDMjdEMzgiKSwgYmlvbWVfY29sc18xMSwgYygiI0Q4QjcwQSIsICIjOTcyRDE1IiwgIiNBMkE0NzUiLCAiIzgxQTg4RCIsIiMwMjQwMUIiLCAiIzQ0NjQ1NSIsICIjRkREMjYyIiwgIiNEM0REREMiLCIjQzI3RDM4IiksIGMoIiNEOEI3MEEiLCAiIzk3MkQxNSIsICIjODFBODhEIiwgIiMwMjQwMUIiLCAiIzQ0NjQ1NSIsICIjRkREMjYyIiwgIiNEM0REREMiLCAiI0M3QjE5QyIsICIjNzk4RTg3IiwgIiNDMjdEMzgiKSwgYygiIzgxQTg4RCIsIiNGREQyNjIiLCAiI0QzREREQyIpLCBjKCIjRDhCNzBBIiwgIiM5NzJEMTUiLCAiIzgxQTg4RCIsICIjNDQ2NDU1IiwgIiNEM0REREMiLCAiI0M3QjE5QyIsICIjNzk4RTg3IiksCmMoIiNEOEI3MEEiLCAiIzk3MkQxNSIsICIjQTJBNDc1IiwgIiM4MUE4OEQiLCAiIzAyNDAxQiIsIiNGREQyNjIiLCAiI0QzREREQyIsICIjQzdCMTlDIiwgIiNDMjdEMzgiKSwiIzgxQTg4RCIsIGMoIiM5NzJEMTUiLCAiI0EyQTQ3NSIsICIjODFBODhEIiwgIiMwMjQwMUIiLCAiI0ZERDI2MiIsICIjRDNERERDIiwgIiNDN0IxOUMiLCAiI0MyN0QzOCIpLApjKCIjRDhCNzBBIiwiIzQ0NjQ1NSIsICIjRkREMjYyIiwgIiNEM0REREMiKSwgYmlvbWVfY29sc18yMiwgYygiI0Q4QjcwQSIsICIjOTcyRDE1IiwgIiM4MUE4OEQiLCIjRDNERERDIiwgIiNDN0IxOUMiLCAiI0MyN0QzOCIpLCBjKCIjRDhCNzBBIiwgIiM0NDY0NTUiLCAiI0ZERDI2MiIsICIjRDNERERDIiwgIiM3OThFODciLCAiI0MyN0QzOCIpLCBjKCIjQTJBNDc1IiwgIiM4MUE4OEQiLCAiIzAyNDAxQiIsIiNGREQyNjIiLCAiI0QzREREQyIsICIjQzdCMTlDIiksCmMoIiNEOEI3MEEiLCAiIzk3MkQxNSIsICIjQTJBNDc1IiwgIiM4MUE4OEQiLCAgIiMwMjQwMUIiLCAiI0ZERDI2MiIsICIjRDNERERDIiwgIiNDN0IxOUMiLCAiI0MyN0QzOCIpLGJpb21lX2NvbHNfMTEsIGMoIiNEOEI3MEEiLCAiI0MyN0QzOCIpLCBiaW9tZV9jb2xzXzExKQoKYmlvbWVfY29sc18yOSA8LSBjKGJpb21lX2NvbHNfMTEsCiAgICAgICAgICAgICAgICAgICBjKCIjRDhCNzBBIiwgIiM5NzJEMTUiLCAiI0EyQTQ3NSIsICIjODFBODhEIiwiIzAyNDAxQiIsICIjNDQ2NDU1IiwgIiNGREQyNjIiLCAiI0QzREREQyIsICIjNzk4RTg3IiwiI0MyN0QzOCIpLCBjKCIjOTcyRDE1IiwgIiNBMkE0NzUiLCAiIzgxQTg4RCIsICIjMDI0MDFCIiwKIiNGREQyNjIiLCAiI0QzREREQyIsICIjQzdCMTlDIiwgIiNDMjdEMzgiKSkKCmdyaWQuY29sIDwtIGMoQ29uaWZlcm91c19Gb3Jlc3RzID0gIiNEOEI3MEEiLCBEcnlfRm9yZXN0ID0gIiM5NzJEMTUiLCAKICAgICAgICAgICAgICBNZWRpdGVycmFuZWFuX1dvb2RsYW5kcyA9ICIjQTJBNDc1IiwgTW9pc3RfRm9yZXN0ID0gIiM4MUE4OEQiLCAKICAgICAgICAgICAgICBTYXZhbm5hcyA9ICIjMDI0MDFCIiwgVGFpZ2EgPSAiIzQ0NjQ1NSIsIFRlbXBlcmF0ZV9HcmFzc2xhbmRzID0gIiNGREQyNjIiLCAKICAgICAgICAgICAgICBUZW1wZXJhdGVfTWl4ZWQgPSAiI0QzREREQyIsIFRyb3BpY2FsX0dyYXNzbGFuZHMgPSAiI0M3QjE5QyIsIFR1bmRyYSA9ICIjNzk4RTg3IiwgCiAgICAgICAgICAgICAgWGVyaWNfV29vZGxhbmRzID0gIiNDMjdEMzgiLCBIeXBuYWxlcyA9ICJncmV5IiwgUG9yZWxsYWxlcyA9ICJncmV5IiwgIAogICAgICAgICAgICAgIFBvdHRpYWxlcyA9ICJncmV5IiwgSG9va2VyaWFsZXMgID0gImdyZXkiLCBCcnlhbGVzID0gImdyZXkiLCBKdW5nZXJtYW5uaWFsZXMgPSAiZ3JleSIsIAogICAgICAgICAgICAgIEFuZHJlYWVhZWFsZXMgPSAiZ3JleSIsIFNwbGFjaG5hbGVzID0gImdyZXkiLCBPcnRob3RyaWNoYWxlcyAgPSAgImdyZXkiLCAgCiAgICAgICAgICAgICAgQmFydHJhbWlhbGVzID0gImdyZXkiLCBNZXR6Z2VyaWFsZXMgPSAiZ3JleSIsIERpY3JhbmFsZXMgPSAiZ3JleSIsIEFudGhvY2Vyb3RhbGVzID0gImdyZXkiLAogICAgICAgICAgICAgIEZ1bmFyaWFsZXMgPSAiZ3JleSIsIFRyZXViaWFsZXMgPSAiZ3JleSIsIEFyY2hpZGlhbGVzID0gImdyZXkiLCBNYXJjaGFudGlhbGVzID0gImdyZXkiLCAKICAgICAgICAgICAgICBQb2x5dHJpY2hhbGVzID0gImdyZXkiLCBBdWxhY29tbmlhbGVzID0gImdyZXkiLCBGb3Nzb21icm9uaWFsZXMgPSAiZ3JleSIsIAogICAgICAgICAgICAgIEdyaW1taWFsZXMgPSAiZ3JleSIsIEhlZHdpZ2lhbGVzID0gImdyZXkiLCBCcnlveGlwaGlhbGVzID0gImdyZXkiLCBCdXhiYXVtaWFsZXMgID0gImdyZXkiLAogICAgICAgICAgICAgIFB0eWNob21uaWFsZXMgPSAiZ3JleSIsIEdpZ2FzcGVybWFsZXMgPSAiZ3JleSIsIERlbmRyb2Nlcm90YWxlcyAgPSAiZ3JleSIsIAogICAgICAgICAgICAgIFBsZXVyb3ppYWxlcyA9ICJncmV5IiwgUmhpem9nb25pYWxlcyA9ICJncmV5IiwgSGFwbG9taXRyaWFsZXMgPSAiZ3JleSIsIEh5cG5vZGVuZHJhbGVzICA9ICJncmV5IiwgCiAgICAgICAgICAgICAgUGFsbGF2aWNpbmlhbGVzID0gImdyZXkiLCAgUGVsbGlhbGVzID0gImdyZXkiLCBOb3RvdGh5bGFkYWxlcyA9ICJncmV5IiwgUmljY2lhbGVzID0gImdyZXkiLCAKICAgICAgICAgICAgICBQdGlsaWRpYWxlcyA9ICJncmV5IiwgU3BoYWVyb2NhcnBhbGVzID0gImdyZXkiLCBTcGhhZ25hbGVzID0gImdyZXkiKQpgYGAKCgojIyMgQmlvbWVzIGluIE5vcnRoIGFuZCBTb3V0aCBBbWVyaWNhCmBgYHtyIG15LWNodW5rLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgZmlnLmFsaWduPSJjZW50ZXIifQpCaW9tZU1hcCA8LSBxdG0oYmlvbWVzX3NocCwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0iYmlvbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwuc3R5bGU9ImZpeGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbC5sYWJlbHM9YmlvbWVzX3NocCRiaW9tZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwucGFsZXR0ZT1jb2xzNywKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbC50aXRsZT0iQmlvbWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmxlZ2VuZC5wb3NpdGlvbj1jKCJsZWZ0IiwiYm90dG9tIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dC5sZWdlbmQud2lkdGg9MS41LAogICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZnJhbWU9RkFMU0UpCkJpb21lTWFwCmBgYAo8Y2VudGVyPgoqRmlndXJlIDEuIE1hcCBvZiBOb3J0aCBhbmQgU291dGggQW1lcmljYW4gYmlvbWVzLiogCjwvY2VudGVyPgogIAogICAgIAogICAgCiAgICAgIAojIyMgQmV0YSBEaXZlcnNpdHkgUGxvdHMgYnkgQmlvbWUKYGBge3IgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTUsIGZpZy5hbGlnbj0iY2VudGVyIiwgd2FybmluZz1GQUxTRX0KQmlvbWVCZXRhV2VpZ2h0QlYgPC0gZ2dwbG90KEJpb21lQmV0YUNlbGxzQ2VudENvdiwgYWVzKHg9VHlwZSwgeT1CZXRhLCBmaWxsPVR5cGUsIGNvbG9yPVR5cGUpKSArIAogIGdlb21fYm94cGxvdChzaG93LmxlZ2VuZCA9IEZBTFNFLCBmaWxsPWJpb21lX2NvbHNfMTEsIGNvbG9yPSJibGFjayIpICsKICBndWlkZXMoeCA9IGd1aWRlX2F4aXMoYW5nbGU9MzApKSArCiAgI3RoZW1lX21pbmltYWwoKSArICAgICAgICAjdW4tY29tbWVudCB3aGljaGV2ZXIgdGhlbWUgeW91IHdhbnQKICB0aGVtZV9ncmF5KCkgKwogICN0aGVtZV9saWdodCgpICsKICAjdGhlbWVfYncoKSArCiAgZ2VvbV92aW9saW4oc2NhbGU9ImNvdW50Iiwgc2hvdy5sZWdlbmQ9RkFMU0UsIGZpbGw9ImdyYXkiLCBhbHBoYT0wLjM1LAogICAgICAgICAgICAgIGNvbG9yPSJncmF5MjUiKSArCiAgeGxhYigiQmlvbWUiKSArCiAgeWxhYigiQmV0YSBEaXZlcnNpdHkiKSArICAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCBzaXplID0gMTYpKQpCaW9tZUJldGFXZWlnaHRCVgpgYGAKICAKICAKICAgIAogICAgICAKIyMjIFJhbmdlIFNpemUgUGxvdHMgYnkgQmlvbWUKYGBge3IgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTUsIGZpZy5hbGlnbj0iY2VudGVyIiwgd2FybmluZz1GQUxTRX0KQmlvbWVSYW5nZUJWIDwtIGdncGxvdChCaW9tZVJhbmdlLCBhZXMoeD1UeXBlLCB5PVJhbmdlLCBmaWxsPVR5cGUsIGNvbG9yPVR5cGUpKSArIAogIGdlb21fYm94cGxvdChzaG93LmxlZ2VuZCA9IEZBTFNFLCBmaWxsPWJpb21lX2NvbHNfMTEsIGNvbG9yPSJibGFjayIpICsKICBndWlkZXMoeCA9IGd1aWRlX2F4aXMoYW5nbGU9MzApKSArCiAgI3VuLWNvbW1lbnQgd2hpY2hldmVyIHRoZW1lIHlvdSB3YW50CiAgI3RoZW1lX21pbmltYWwoKSArICAgICAgICAKICB0aGVtZV9ncmF5KCkgKwogICN0aGVtZV9saWdodCgpICsKICAjdGhlbWVfYncoKSArCiAgZ2VvbV92aW9saW4oc2NhbGU9ImNvdW50Iiwgc2hvdy5sZWdlbmQ9RkFMU0UsIGZpbGw9ImdyYXkiLCBhbHBoYT0wLjM1LAogICAgICAgICAgICAgIGNvbG9yPSJncmF5MjUiKSArCiAgeGxhYigiQmlvbWUiKSArCiAgeWxhYigiUmFuZ2UiKSArICAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTIwKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCBzaXplID0gMTYpKQpCaW9tZVJhbmdlQlYKYGBgCiAgCiAgICAKICAgICAgCiAgICAgICAgCiMjIyBBbHBoYSBEaXZlcnNpdHkgYnkgT3JkZXIsIFNwbGl0IGludG8gQmlvbWVzCiMjIyMgT3JkZXJzIHdpdGggTWF4aW11bSBBbHBoYSBEaXZlcnNpdHkgPiAxMApgYGB7ciBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD0xNSwgZmlnLmFsaWduPSJjZW50ZXIiLCB3YXJuaW5nPUZBTFNFfQpGYWNldE9CUkJlbG93MTAgPC0gZ2dwbG90KE9CUkJlbG93MTBERiwgYWVzKHg9QmlvbWUsIHk9QWxwaGEsIGZpbGw9QmlvbWUsIGNvbG9yPUJpb21lKSkgKyAKICBnZW9tX2JveHBsb3Qoc2hvdy5sZWdlbmQgPSBGQUxTRSwgZmlsbD1iaW9tZV9jb2xzXzE2NiwgY29sb3I9ImJsYWNrIiwgb3V0bGllci5zaXplPTAuNykgKwogICN1bi1jb21tZW50IHdoaWNoZXZlciB0aGVtZSB5b3Ugd2FudAogICN0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lX2dyYXkoKSArCiAgI3RoZW1lX2xpZ2h0KCkgKwogICN0aGVtZV9idygpICsKICAjdGhlbWVfZGFyaygpICsKICAjdGhlbWVfbGluZWRyYXcoKSArCiAgI2dlb21fdmlvbGluKHNjYWxlPSJjb3VudCIsIHNob3cubGVnZW5kPUZBTFNFLCBmaWxsPSJncmF5IiwgYWxwaGE9MC4zNSwgY29sb3I9ImdyYXkyNSIpICsKICB4bGFiKCJCaW9tZSIpICsKICB5bGFiKCJSaWNobmVzcyIpICsgIAogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHNpemUgPSAxMikpKwogIGZhY2V0X3dyYXAofk9yZGVyLAogICAgICAgICAgICAgI3VuLWNvbW1lbnQgIyBvZiByb3dzIHlvdSB3YW50CiAgICAgICAgICAgICBuY29sPTYgCiAgICAgICAgICAgICAjbmNvbD01CiAgICAgICAgICAgICApCkZhY2V0T0JSQmVsb3cxMApgYGAKICAgCiAgICAgIAojIyMjIE9yZGVycyB3aXRoIE1heGltdW0gQWxwaGEgRGl2ZXJzaXR5IGJldHdlZW4gMTAgYW5kIDI1CmBgYHtyIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTE3LCBmaWcuYWxpZ249ImNlbnRlciIsIHdhcm5pbmc9RkFMU0V9CkZhY2V0T0JSMTB0bzI1IDwtIGdncGxvdChPQlIxMHRvMjVERiwgYWVzKHg9QmlvbWUsIHk9QWxwaGEsIGZpbGw9QmlvbWUsIGNvbG9yPUJpb21lKSkgKyAKICBnZW9tX2JveHBsb3Qoc2hvdy5sZWdlbmQgPSBGQUxTRSwgZmlsbD1iaW9tZV9jb2xzXzY2LCBjb2xvcj0iYmxhY2siLCBvdXRsaWVyLnNpemU9MC43KSArCiAgI3VuLWNvbW1lbnQgd2hpY2hldmVyIHRoZW1lIHlvdSB3YW50CiAgI3RoZW1lX21pbmltYWwoKSArCiAgdGhlbWVfZ3JheSgpICsKICAjdGhlbWVfbGlnaHQoKSArCiAgI3RoZW1lX2J3KCkgKwogICN0aGVtZV9kYXJrKCkgKwogICN0aGVtZV9saW5lZHJhdygpICsKICBnZW9tX3Zpb2xpbihzY2FsZT0iY291bnQiLCBzaG93LmxlZ2VuZD1GQUxTRSwgZmlsbD0iZ3JheSIsIGFscGhhPTAuMzUsIGNvbG9yPSJncmF5MjUiKSArCiAgeGxhYigiQmlvbWUiKSArCiAgeWxhYigiUmljaG5lc3MiKSArICAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTIpKSsKICBmYWNldF93cmFwKH5PcmRlciwKICAgICAgICAgICAgICN1bi1jb21tZW50ICMgb2Ygcm93cyB5b3Ugd2FudAogICAgICAgICAgICAgbmNvbD0zCiAgICAgICAgICAgICAjbmNvbD0yCiAgICAgICAgICAgICApCkZhY2V0T0JSMTB0bzI1CmBgYAogIAogICAgCiMjIyMgT3JkZXJzIHdpdGggTWF4aW11bSBBbHBoYSBEaXZlcnNpdHkgYmV0d2VlbiAyNSBhbmQgMTAwCmBgYHtyIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xNiwgZmlnLmFsaWduPSJjZW50ZXIiLCB3YXJuaW5nPUZBTFNFfQpGYWNldE9CUjI1dG8xMDAgPC0gZ2dwbG90KE9CUjI1dG8xMDBERiwgYWVzKHg9QmlvbWUsIHk9QWxwaGEsIGZpbGw9QmlvbWUsIGNvbG9yPUJpb21lKSkgKyAKICBnZW9tX2JveHBsb3Qoc2hvdy5sZWdlbmQgPSBGQUxTRSwgZmlsbD1iaW9tZV9jb2xzXzg3LCBjb2xvcj0iYmxhY2siLCBvdXRsaWVyLnNpemU9MC43KSArCiAgI3VuLWNvbW1lbnQgd2hpY2hldmVyIHRoZW1lIHlvdSB3YW50CiAgI3RoZW1lX21pbmltYWwoKSArCiAgdGhlbWVfZ3JheSgpICsKICAjdGhlbWVfbGlnaHQoKSArCiAgI3RoZW1lX2J3KCkgKwogICN0aGVtZV9kYXJrKCkgKwogICN0aGVtZV9saW5lZHJhdygpICsKICBnZW9tX3Zpb2xpbihzY2FsZT0iY291bnQiLCBzaG93LmxlZ2VuZD1GQUxTRSwgZmlsbD0iZ3JheSIsIGFscGhhPTAuMzUsIGNvbG9yPSJncmF5MjUiKSArCiAgeGxhYigiQmlvbWUiKSArCiAgeWxhYigiUmljaG5lc3MiKSArICAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0yMiksIAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSxheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTE1KSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCBzaXplID0gMTApKSArCiAgZmFjZXRfd3JhcCh+T3JkZXIsIAogICAgICAgICAgICAgI3VuLWNvbW1lbnQgIyBvZiByb3dzIHlvdSB3YW50CiAgICAgICAgICAgICBuY29sPTQKICAgICAgICAgICAgICNuY29sPTIKICAgICAgICAgICAgICkKRmFjZXRPQlIyNXRvMTAwCmBgYAogIAogICAgCiMjIyMgT3JkZXJzIHdpdGggTWF4aW11bSBBbHBoYSBEaXZlcnNpdHkgPiAxMDAKYGBge3IgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTUsIGZpZy5hbGlnbj0iY2VudGVyIiwgd2FybmluZz1GQUxTRX0KRmFjZXRPQlJBYm92ZTEwMCA8LSBnZ3Bsb3QoT0JSQWJvdmUxMDBERiwgYWVzKHg9QmlvbWUsIHk9QWxwaGEsIGZpbGw9QmlvbWUsIGNvbG9yPUJpb21lKSkgKyAKICBnZW9tX2JveHBsb3Qoc2hvdy5sZWdlbmQgPSBGQUxTRSwgZmlsbD1iaW9tZV9jb2xzXzIyLCBjb2xvcj0iYmxhY2siLCAgb3V0bGllci5zaXplPTEpICsKICAjdW4tY29tbWVudCB3aGljaGV2ZXIgdGhlbWUgeW91IHdhbnQKICAjdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZV9ncmF5KCkgKwogICN0aGVtZV9saWdodCgpICsKICAjdGhlbWVfYncoKSArCiAgI3RoZW1lX2RhcmsoKSArCiAgI3RoZW1lX2xpbmVkcmF3KCkgKwogIGdlb21fdmlvbGluKHNjYWxlPSJjb3VudCIsIHNob3cubGVnZW5kPUZBTFNFLCBmaWxsPSJncmF5IiwgYWxwaGE9MC4zNSwgY29sb3I9ImdyYXkyNSIpICsKICB4bGFiKCJCaW9tZSIpICsKICB5bGFiKCJSaWNobmVzcyIpICsgIAogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSwgCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemU9MjIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxMikpICsKICBmYWNldF93cmFwKH5PcmRlciwgCiAgICAgICAgICAgICAjdW4tY29tbWVudCAjIG9mIHJvd3MgeW91IHdhbnQKICAgICAgICAgICAgIG5jb2w9MgogICAgICAgICAgICAgI25jb2w9MQogICAgICAgICAgICAgKQpGYWNldE9CUkFib3ZlMTAwCmBgYAogIAogIAogICAgCiAgICAgICAKIyMjIENpcmNsZSBQbG90cyAKIyMjIyAqU3BlY2llcyByaWNobmVzcyBmb3IgZWFjaCBvcmRlciwgZ3JvdXBlZCBieSBiaW9tZSoKIyMjIyBBbGwgYnJ5b3BoeXRlIG9yZGVycwpgYGB7ciBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD05LCBmaWcuYWxpZ249ImNlbnRlciJ9CmNpcmNvcy5jbGVhcigpCmNpcmNvcy5wYXIoc3RhcnQuZGVncmVlID0gMCkKY2hvcmREaWFncmFtKENpcmNsZU1hdEFsbCwgZ3JpZC5jb2wgPSBncmlkLmNvbCwgY29sdW1uLmNvbCA9IGJpb21lX2NvbHNfMTEsIAogICAgICAgICAgICAgZGlyZWN0aW9uYWwgPSAxLCBkaXJlY3Rpb24udHlwZSA9ICJhcnJvd3MiLCBsaW5rLmFyci50eXBlID0gImJpZy5hcnJvdyIsIAogICAgICAgICAgICAgbGluay5hcnIubGVuZ3RoID0gMC4wNSwgbGluay5sYXJnZXN0Lm9udG9wID0gVCwgYW5ub3RhdGlvblRyYWNrID0gYygiZ3JpZCIpLCAKICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gMSwgYmlnLmdhcCA9IDIwLCBzbWFsbC5nYXAgPSAyKQpjaXJjb3MudHJhY2tQbG90UmVnaW9uKHRyYWNrLmluZGV4ID0gMSwgcGFuZWwuZnVuID0gZnVuY3Rpb24oeCwgeSkgewogIHhsaW0gPSBnZXQuY2VsbC5tZXRhLmRhdGEoInhsaW0iKQogIHlsaW0gPSBnZXQuY2VsbC5tZXRhLmRhdGEoInlsaW0iKQogIHNlY3Rvci5uYW1lID0gZ2V0LmNlbGwubWV0YS5kYXRhKCJzZWN0b3IuaW5kZXgiKQogIGNpcmNvcy50ZXh0KG1lYW4oeGxpbSksIHlsaW1bMV0sIHNlY3Rvci5uYW1lLCBmYWNpbmcgPSAiY2xvY2t3aXNlIiwgbmljZUZhY2luZyA9IFRSVUUsIGFkaiA9IGMoMCwgMC41KSwgY2V4PTAuNSkKfSwgYmcuYm9yZGVyID0gTkEpCmBgYAogIAogICAgCiMjIyMgT25seSBtb3NzIG9yZGVycwpgYGB7ciBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD05LCBmaWcuYWxpZ249ImNlbnRlciJ9CmNpcmNvcy5jbGVhcigpCmNpcmNvcy5wYXIoc3RhcnQuZGVncmVlID0gMCkKY2hvcmREaWFncmFtKENpcmNsZU1hdEFsbE1vc3MsIGdyaWQuY29sID0gZ3JpZC5jb2wsIGNvbHVtbi5jb2wgPSBiaW9tZV9jb2xzXzExLCAKICAgICAgICAgICAgIGRpcmVjdGlvbmFsID0gMSwgZGlyZWN0aW9uLnR5cGUgPSAiYXJyb3dzIiwgbGluay5hcnIudHlwZSA9ICJiaWcuYXJyb3ciLCAKICAgICAgICAgICAgIGxpbmsuYXJyLmxlbmd0aCA9IDAuMDUsIGxpbmsubGFyZ2VzdC5vbnRvcCA9IFQsIGFubm90YXRpb25UcmFjayA9IGMoImdyaWQiKSwgCiAgICAgICAgICAgICBwcmVBbGxvY2F0ZVRyYWNrcyA9IDEsIGJpZy5nYXAgPSAyMCwgc21hbGwuZ2FwID0gMikKY2lyY29zLnRyYWNrUGxvdFJlZ2lvbih0cmFjay5pbmRleCA9IDEsIHBhbmVsLmZ1biA9IGZ1bmN0aW9uKHgsIHkpIHsKICB4bGltID0gZ2V0LmNlbGwubWV0YS5kYXRhKCJ4bGltIikKICB5bGltID0gZ2V0LmNlbGwubWV0YS5kYXRhKCJ5bGltIikKICBzZWN0b3IubmFtZSA9IGdldC5jZWxsLm1ldGEuZGF0YSgic2VjdG9yLmluZGV4IikKICBjaXJjb3MudGV4dChtZWFuKHhsaW0pLCB5bGltWzFdLCBzZWN0b3IubmFtZSwgZmFjaW5nID0gImNsb2Nrd2lzZSIsIG5pY2VGYWNpbmcgPSBUUlVFLCBhZGogPSBjKDAsIDAuNSksIGNleD0wLjUpCn0sIGJnLmJvcmRlciA9IE5BKQpgYGAKCg==